//给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。 
//
// 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。 
//
// 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。 
//
// 示例： 
//
// 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
//输出：7 -> 0 -> 8
//原因：342 + 465 = 807
// 
// Related Topics 链表 数学 
// 👍 4832 👎 0

package leetcode.editor.cn;

// Java2: 两数相加
class Q2AddTwoNumbers {
    public static void main(String[] args) {
        Solution solution = new Q2AddTwoNumbers().new Solution();
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(9);
        l2.next = new ListNode(9);
        solution.addTwoNumbers(l1, l2);
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode r = new ListNode(0);
            my(l1, l2, r, false);
            return r;
        }

        private void my(ListNode l1, ListNode l2, ListNode r, boolean jinwei) {
            if (l1 != null) r.val = r.val + l1.val;
            else l1 = new ListNode(0);
            if (l2 != null) r.val = r.val + l2.val;
            else l2 = new ListNode(0);

            if (jinwei) r.val = r.val + 1;

            jinwei = false;
            if (r.val > 9) {
                r.val = r.val % 10;
                jinwei = true;
            }

            if (l1.next != null || l2.next != null || jinwei) {
                r.next = new ListNode(0);
                my(l1.next, l2.next, r.next, jinwei);
            }
        }

        private void web(ListNode l1, ListNode l2, ListNode r) {
            if (l1 != null) r.val = r.val + l1.val;
            else l1 = new ListNode(0);
            if (l2 != null) r.val = r.val + l2.val;
            else l2 = new ListNode(0);

            if (r.val > 9) {
                r.next = new ListNode(r.val / 10);
                r.val = r.val % 10;
            }

            if (l1.next != null || l2.next != null) {
                if (r.next == null) r.next = new ListNode(0);
                web(l1.next, l2.next, r.next);
            }
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }
}

